package model

import (
	"encoding/base64"
	"fmt"
	"github.com/jinzhu/gorm"
	"golang.org/x/crypto/scrypt"
	"log"
	"wangblog/utils/errmsg"
)

type User struct{
	gorm.Model
	Username string `gorm:"type: varchar(20);not null" json:"username"validate:"required,min=4,max=12"label:"用户名"`
	Password string `gorm:"type:varchar(20);not null" json:"password" validate:"required,min=6,max=20"label:"密码"`
	Role int `gorm:"type:int;DEFAULT:2" json:"role" validate:"required,gte=2"label:"角色码"`
}

//查询用户是否存在
func CheckUser(name string)(code int){
	var users User
	db.Select("id").Where("username = ?",name).First(&users)
	if users.ID>0{
		return errmsg.ERROR_USERNAME_USED
	}
	return errmsg.SUCCSE
}

//新增用户
func CreateUser(data *User)int{
	//data.Password=ScryptPw(data.Password)
	err:=db.Create(&data).Error
	if err!=nil{
		return errmsg.ERROR
	}
	return errmsg.SUCCSE
}

//查询用户列表
func GetUsers(pageSize int,pageNum int)([]User,int){
	var users []User
	var total int
	err=db.Limit(pageSize).Offset((pageNum-1)*pageSize).Find(&users).Count(&total).Error
	if err!=nil &&err!=gorm.ErrRecordNotFound{
		return nil,0
	}
	return users,total
}

//编辑用户信息
func EditUser(id int,data *User)int{
	var user User
	var maps = make(map[string]interface{})
	maps["username"]=data.Username
	maps["role"]=data.Role
	err=db.Model(&user).Where("id=?",id).Update(maps).Error
	if err!=nil{
		return errmsg.ERROR
	}
	return errmsg.SUCCSE
}


//删除用户
func DeleteUser(id int)int{
	err=db.Where("id=?",id).Delete(&User{}).Error
	if err!=nil{
		return errmsg.ERROR
	}
	return errmsg.SUCCSE
}

//密码加密
func (u *User)BeforeSave(){
	u.Password=ScryptPw(u.Password)
}
//在进行加密的时候一般使用bcrypt，这里使用scrypt作为测试
func ScryptPw(password string)string{
	const KeyLen=10
	salt:=make([]byte,8)
	salt=[]byte{12,32,4,6,66,222,11}
	HashPw,err:=scrypt.Key([]byte(password),salt,16384,8,1,KeyLen)
	if err!=nil{
		log.Fatal(err)
	}
	fmt.Println(string(HashPw))
	fpw:=base64.StdEncoding.EncodeToString(HashPw)
	return fpw
}

//登录验证
func CheckLogin(username string,password string)int{
	var user User
	db.Where("username=?",username).First(&user)
	if user.ID==0{
		return errmsg.ERROR_USER_NOT_EXIST
	}
	if ScryptPw(password)!=user.Password{
		return errmsg.ERROR_PASSWORD_WRONG
	}
	if user.Role!=1{
		return errmsg.ERROR_USER_NO_RIGHT
	}
	return errmsg.SUCCSE
}






